package high.concurrent.config;

import com.alibaba.fastjson.JSON;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import high.concurrent.dto.AccountDto;
import high.concurrent.enums.MQConstant;
import high.concurrent.model.TxMsg;
import high.concurrent.service.TxMsgService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;


/**
 * 任务Handler示例（Bean模式）
 *
 * 开发步骤：
 * 1、继承"IJobHandler"：“com.xxl.job.core.handler.IJobHandler”；
 * 2、注册到Spring容器：添加“@Component”注解，被Spring容器扫描为Bean实例；
 * 3、注册到执行器工厂：添加“@JobHandler(value="自定义jobhandler名称")”注解，注解value值对应的是调度中心新建任务的JobHandler属性的值。
 * 4、执行日志：需要通过 "XxlJobLogger.log" 打印执行日志；
 *
 */
@Slf4j
@Component
public class ConsumeMsgJobHandler {


    @Autowired(required = false)
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private TxMsgService txMsgService;

    /**
     * 过期时间 单位分钟
     */
    private static final int VERDUE_TIME=5;

    @XxlJob("consumeMsgJobHandler")
    public ReturnT<String> consumeMsgJobHandler(String s) throws Exception {

        log.info("进入消费定时任务..........................");

        this.processMsg();

        return SUCCESS;
    }

    public void processMsg() {

        //1.消息服务定期轮询，过期的“已发送”消息（过期一般是根据业务规则来自行调整，例如2min）
        List<TxMsg> msgList = this.txMsgService.selectOverdueMsgBySend(VERDUE_TIME);

        for (TxMsg msg : msgList) {

            // 把对象转换为json
            AccountDto accountDto = JSON.parseObject(msg.getJsonMsg(), AccountDto.class);
            //2.消息服务重新将过期的“已发送”消息，发送到消息中间件MQ中。
            rabbitTemplate.convertAndSend(MQConstant.EXCHANGE_NAME, msg.getRoutingKey(),accountDto);

        }
    }
}